package edu.pe.cayetano.model.bo;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.dao.CursoDAO;
import edu.pe.cayetano.dao.OperacionesComunesDAO;
import edu.pe.cayetano.framework.BusinessException;
import edu.pe.cayetano.framework.Configuration;
import edu.pe.cayetano.model.to.CursoTO;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;

public class CursoBO  extends BaseBO{

	private	String		schema			= Configuration.getSchemaDB();
	
	/**
	 * Metodo que devuelve los datos de un curso especifico
	 * */
	public BResult getCurso(String codigoCurso) throws BusinessException{
		BResult 			retSalida		= new BResult();
		CursoTO				cursoTO 		= null;
		CursoDAO			cursoDAO		= null;
		try{
			conectar();
			cursoDAO	 	= new CursoDAO(conn);
			cursoTO = cursoDAO.getCurso(codigoCurso);
			retSalida.setObject(cursoTO);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CursoBO] error en metodo getCurso generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CursoBO] error en metodo getCurso generado por:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * Retorna el listado de cursos
	 * */
	public BResult listarCursos() throws BusinessException{
		BResult 				retSalida		= new BResult();
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			query = estableceQuery(ConstantesSECCD.OPERACION_LISTADO,"","");
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CursoBO] error en metodo listarCursos generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CursoBO] error en metodo listarCursos generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	/**
	 * Listar los cursos matriculados por un alumno en el periodo academico vigente 
	 * */
	public BResult listarCursosAlumno(String codigoAlumno) throws BusinessException{
		BResult 				retSalida		= new BResult();
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			query = estableceQueryCursoAlumno(codigoAlumno,ConstantesSECCD.OPERACION_LISTADO,"","");
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[CursoBO] error en metodo listarCursosAlumno generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[CursoBO] error en metodo listarCursosAlumno generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * Retorna el query para el listado de cursos
	 * */
	public StringBuffer estableceQuery(String operacion,String campo,String criterio){
		StringBuffer 			query 			= new StringBuffer();
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query.append(" SELECT COD_CURSO AS CODIGO,NOMBRE FROM "+schema+"CURSO");
			}else{
				query.append(" SELECT COD_CURSO AS CODIGO,NOMBRE FROM "+schema+"CURSO");
				query.append(" AND UPPER("+campo.toUpperCase()+") LIKE '%"+criterio.toUpperCase()+"%'"); 
			}

		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query.append(" SELECT COD_CURSO AS CODIGO,NOMBRE FROM "+schema+"CURSO");
		}
		System.out.println("[CursoBO][estableceQuery] query:"+query.toString());
		return query;
	}

	/**
	 * Retorna el query para el listado de cursos de un alumno
	 * */
	public StringBuffer estableceQueryCursoAlumno(String codigoAlumno,String operacion,String campo,String criterio){
		StringBuffer 			query 			= new StringBuffer();
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_BUSQUEDA)){
			if(campo.equalsIgnoreCase("todos")){
				query.append(" SELECT D.NOMBRE AS PERIDO_ACADEMICO,E.NOMBRE AS CURRICULA,B.COD_CURSO AS CODIGO_CURSO, ");
				query.append(" C.NOMBRE AS CURSO,A.CODIGO_ALUMNO,NOMBRE_COMPLETO");
				query.append(" FROM "+schema+"MATRICULA A INNER JOIN "+schema+"PROGRAMACION_ACADEMICA B");
				query.append(" ON B.PROGACAD_ID=A.PROGACAD_ID");
				query.append(" INNER JOIN "+schema+"CURSO C ON C.COD_CURSO=B.COD_CURSO");
				query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO D ");
				query.append(" ON D.PERIODOACADEMICO_ID=B.PERIODOACADEMICO_ID");
				query.append(" INNER JOIN "+schema+"CURRICULA E ");
				query.append(" ON E.CURRICULA_ID=B.CURRICULA_ID");
				query.append(" INNER JOIN "+schema+"ALUMNO F");
				query.append(" ON F.CODIGO_ALUMNO=A.CODIGO_ALUMNO");
				query.append(" WHERE A.CODIGO_ALUMNO='"+codigoAlumno+"'");
			}else{
				query.append(" SELECT D.NOMBRE AS PERIDO_ACADEMICO,E.NOMBRE AS CURRICULA,B.COD_CURSO AS CODIGO_CURSO, ");
				query.append(" C.NOMBRE AS CURSO,A.CODIGO_ALUMNO,NOMBRE_COMPLETO");
				query.append(" FROM "+schema+"MATRICULA A INNER JOIN "+schema+"PROGRAMACION_ACADEMICA B");
				query.append(" ON B.PROGACAD_ID=A.PROGACAD_ID");
				query.append(" INNER JOIN "+schema+"CURSO C ON C.COD_CURSO=B.COD_CURSO");
				query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO D ");
				query.append(" ON D.PERIODOACADEMICO_ID=B.PERIODOACADEMICO_ID");
				query.append(" INNER JOIN "+schema+"CURRICULA E ");
				query.append(" ON E.CURRICULA_ID=B.CURRICULA_ID");
				query.append(" INNER JOIN "+schema+"ALUMNO F");
				query.append(" ON F.CODIGO_ALUMNO=A.CODIGO_ALUMNO");
				query.append(" WHERE A.CODIGO_ALUMNO='"+codigoAlumno+"'");
			}
		}
		if(operacion.equalsIgnoreCase(ConstantesSECCD.OPERACION_LISTADO)){
			query.append(" SELECT D.NOMBRE AS PERIODO_ACADEMICO,E.NOMBRE AS CURRICULA,B.COD_CURSO AS CODIGO_CURSO, ");
			query.append(" C.NOMBRE AS CURSO,A.CODIGO_ALUMNO,NOMBRE_COMPLETO");
			query.append(" FROM "+schema+"MATRICULA A INNER JOIN "+schema+"PROGRAMACION_ACADEMICA B");
			query.append(" ON B.PROGACAD_ID=A.PROGACAD_ID");
			query.append(" INNER JOIN "+schema+"CURSO C ON C.COD_CURSO=B.COD_CURSO");
			query.append(" INNER JOIN "+schema+"PERIODO_ACADEMICO D ");
			query.append(" ON D.PERIODOACADEMICO_ID=B.PERIODOACADEMICO_ID");
			query.append(" INNER JOIN "+schema+"CURRICULA E ");
			query.append(" ON E.CURRICULA_ID=B.CURRICULA_ID");
			query.append(" INNER JOIN "+schema+"ALUMNO F");
			query.append(" ON F.CODIGO_ALUMNO=A.CODIGO_ALUMNO");
			query.append(" WHERE A.CODIGO_ALUMNO='"+codigoAlumno+"'");
		}
		System.out.println("[CursoBO][estableceQueryCursoAlumno] query:"+query.toString());
		return query;
	}
}
